/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package alphacomposite;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 *
 * @author Nhat Lam
 */
public class AlphaCompositeDemo extends JFrame {
  MyCanvas canvas;

  JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 5);

  JComboBox rulesBox;

  String[] rulesLabels = { "Clear", "Source", "Source-over",
      "Destination-over", "Source-in", "Destination-in", "Source-out",
      "Destination-out" };

  int[] rules = { AlphaComposite.CLEAR, AlphaComposite.SRC,
      AlphaComposite.SRC_OVER, AlphaComposite.DST_OVER,
      AlphaComposite.SRC_IN, AlphaComposite.DST_IN,
      AlphaComposite.SRC_OUT, AlphaComposite.DST_OUT };

  public AlphaCompositeDemo() {
    super();
    Container container = getContentPane();

    canvas = new MyCanvas();
    container.add(canvas);

    rulesBox = new JComboBox(rulesLabels);
    rulesBox.setSelectedIndex(0);
    rulesBox.setAlignmentX(Component.LEFT_ALIGNMENT);
    rulesBox.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox) e.getSource();
        canvas.compositeRule = rules[cb.getSelectedIndex()];
        canvas.repaint();
      }
    });

    slider.setPaintTicks(true);
    slider.setMajorTickSpacing(25);
    slider.setMinorTickSpacing(25);
    slider.setPaintLabels(true);
    slider.addChangeListener(new ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        JSlider slider = (JSlider) e.getSource();
        canvas.alphaValue = (float) slider.getValue() / 100;
        canvas.repaint();
      }
    });

    
    
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1, 3));
    panel.add(rulesBox);
    panel.add(new JLabel("Alpha Adjustment x E-2: ", JLabel.RIGHT));
    panel.add(slider);
    container.add(panel, BorderLayout.SOUTH);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    setSize(500,300);
    setVisible(true);
  }

  public static void main(String arg[]) {
    new AlphaCompositeDemo();
  }

  class MyCanvas extends JLabel {
    float alphaValue = 1.0f;

    int compositeRule = AlphaComposite.CLEAR;

    AlphaComposite ac;

    public void paint(Graphics g) {
      Graphics2D g2D = (Graphics2D) g;

      int w = getSize().width;
      int h = getSize().height;

      BufferedImage bi = new BufferedImage(w, h,
          BufferedImage.TYPE_INT_ARGB);
      Graphics2D big = bi.createGraphics();

      ac = AlphaComposite.getInstance(compositeRule, alphaValue);

      big.setColor(Color.red);
      big.drawString("Destination", w / 4, h / 4);
      big.fill(new Ellipse2D.Double(0, h / 3, 2 * w / 3, h / 3));

      big.setColor(Color.blue);
      big.drawString("Source", 3 * w / 4, h / 4);

      big.setComposite(ac);
      big.fill(new Ellipse2D.Double(w / 3, h / 3, 2 * w / 3, h / 3));

      g2D.drawImage(bi, null, 0, 0);
    }
  }

}

